﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Useful.GUI.HierarchyDataGridView
{
    /// Дополнительная информация к строке грида об элементе группы
    /// Для заголовочнйо ячейки группы - GroupRows != null и BaseGroup == null
    /// Для обычной ячейки - GroupRows == null и BaseGroup != null
    internal class GroupItem
    {
        private readonly List<DataGridViewRow> GroupRows; // Список строк в группе

        public GroupItem BaseGroup; // Базовая группа (надгруппа)

        internal ControllerType RowType { get; private set; } // Тип значка

        private bool _Visible;
        public bool Visible // Видимость - включая проверку на видимость в надгруппе
        {
            get
            {
                return _Visible && (BaseGroup != null ? BaseGroup.Visible : true);
            }
            set
            {
                _Visible = value;
            }
        }

        private GroupItem(List<DataGridViewRow> group, ControllerType rowType)
        {
            Visible = true;
            GroupRows = group;
            RowType = rowType;
        }

        //public static GroupItem CreateSimpleItem()
        //{
        //    return new GroupItem(null, ControllerType.Simple);
        //}

        // Создать группу для заготовочной ячейки
        public static GroupItem CreateHeaderItem(List<DataGridViewRow> group)
        {
            return new GroupItem(group, ControllerType.GroupHeaderMinus);
        }

        // Создать группу для обычной ячейки (которая входим в группу baseGroup)
        public static GroupItem CreateGroupItem(GroupItem baseGroup)
        {
            GroupItem res = new GroupItem(null, ControllerType.GroupRowItem);

            res.BaseGroup = baseGroup;

            return res;
        }

        // Заголовочная ячейка или нет
        public bool IsHeaderItem
        {
            get
            {
                return GroupRows != null; //RowType == ControllerType.GroupHeaderPlus || RowType == ControllerType.GroupHeaderMinus;
            }
        }

        private void TestHeaderItem()
        {
            if (!IsHeaderItem)
                throw new GuiException("TestHeaderItem");
        }

        // Раскрыта группа или нет
        public bool IsExpanded
        {
            get
            {
                TestHeaderItem();

                return RowType == ControllerType.GroupHeaderMinus;
            }
            set
            {
                TestHeaderItem();

                if (RowType != ControllerType.Simple)
                    RowType = value ? ControllerType.GroupHeaderMinus : ControllerType.GroupHeaderPlus;
            }
        }

        // Получить строку в группе
        public DataGridViewRow GetRow(int index)
        {
            TestHeaderItem();

            return GroupRows[index];
        }

        // Кол-во строк в группе
        public int Count
        {
            get
            {
                TestHeaderItem();

                return GroupRows.Count;
            }
        }

        //public RowHeaderCell GetHeaderCell(int index)
        //{
        //    return (RowHeaderCell)GroupRows[index].HeaderCell;
        //}

        // Устанавливаем признак того, что данный элемент - последний в группе
        public void SetLastGroup(bool isLast)
        {
            RowType = isLast ? ControllerType.LastGroupItem : ControllerType.Simple;
        }
    }
}
